/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package calcolatrice;

/**
 *
 * @author Gabryz
 */
import alice.tuprolog.*;
import Parser.*;
import java.io.IOException;

public class Calcolatore {
    String Risultato, Parziale;
    public Calcolatore(){};
    Prolog engine=new Prolog();

    public String Calcola(String TextBox){
        try {
          Theory t = new Theory(new java.io.FileInputStream("prog_math.pl"));
            engine.setTheory(t);
        } catch (InvalidTheoryException e) {
            System.err.println("Teoria non valida.");
            System.exit(1);
        }
        catch(IOException e){
            System.err.println("Errore nella lettura della Teoria.");
            System.exit(1);
        }
        String prologInputString = TextBox.replace('(', '[').replace(')', ']');
        try {
            Term expression = Term.parse(prologInputString);
            // costruisce la struttura Prolog a partire dalla stringa
            Term query = // QUERY: evalExpr(espressione, Result)
                new Struct("evalExpr", expression, new Var("Result"));
            // costruisce "a mano" la struttura Prolog per la query

            SolveInfo info = engine.solve(query); // ATTIVA IL MOTORE
            // l'oggetto info contiene le informazioni sulla soluzione

            if (info.isSuccess()) {
                Term resultTerm = info.getTerm("Result");
                alice.tuprolog.Number num = (alice.tuprolog.Number) resultTerm;
                // getTerm restituisce un Term  occorre cast verso Number
                int ires = num.intValue(); // conversione in int
                Risultato= TextBox + " = " + ires;
            } else {
                Risultato = "err";
            }
            //System.exit(0);
            // fa chiudere i thread delle finestre di dialogo
        }
        catch (InvalidTermException e) {
                System.err.println("L'espressione non è valida in Prolog.");
                System.exit(1);
        }
        /*catch (InvalidVarNameException e) {
                System.err.println("Il nome della variabile non è valido.");
                System.exit(1);
        }*/
        catch (UnknownVarException e) { // NUOVA tuProlog 1.3
                System.err.println("Il nome della variabile è sconosciuto.");
                System.exit(1);
        }
        catch (NoSolutionException e) {
                System.err.println("Errore, non dovrei essere qui).");
                System.exit(1);
        }
        return Risultato;
    }
    public String CalcolaDerivata(String TextBox){
        try {
          Theory t = new Theory(new java.io.FileInputStream("derivate.pl"));
            engine.setTheory(t);
        } catch (InvalidTheoryException e) {
            System.err.println("Teoria non valida.");
            System.exit(1);
        }
        catch(IOException e){
            System.err.println("Errore nella lettura della Teoria.");
            System.exit(1);
        }
        //String prologInputString = TextBox.replace('(', '[').replace(')', ']');
        try {
            Term expression = Term.parse(TextBox);
            // costruisce la struttura Prolog a partire dalla stringa
            Term query = // QUERY: evalExpr(espressione, Result)
                new Struct("dExpr", expression, new Var("Result"));
            // costruisce "a mano" la struttura Prolog per la query

            SolveInfo info = engine.solve(query); // ATTIVA IL MOTORE
            // l'oggetto info contiene le informazioni sulla soluzione

            if (info.isSuccess()) {
               Term resultTerm = info.getTerm("Result");
                String temp=resultTerm.toString();
                String input=temp.replace("'", "");
                System.out.println(input);
                //passo il risultato di prolog al parser
                String output=ModificaInInfissa(input);
                Risultato=TextBox + " = " + output;

            } else {
                Risultato = "err";
            }
            //System.exit(0);
            // fa chiudere i thread delle finestre di dialogo
        }
        catch (InvalidTermException e) {
                System.err.println("L'espressione non è valida in Prolog.");
                System.exit(1);
        }
        /*catch (InvalidVarNameException e) {
                System.err.println("Il nome della variabile non è valido.");
                System.exit(1);
        }*/
        catch (UnknownVarException e) { // NUOVA tuProlog 1.3
                System.err.println("Il nome della variabile è sconosciuto.");
                System.exit(1);
        }
        catch (NoSolutionException e) {
                System.err.println("Errore, non dovrei essere qui).");
                System.exit(1);
        }
        return Risultato;
    }
    public String CalcolaIntegrale(String TextBox){
        try {
          Theory t = new Theory(new java.io.FileInputStream("integrali.pl"));
            engine.setTheory(t);
        } catch (InvalidTheoryException e) {
            System.err.println("Teoria non valida.");
            System.exit(1);
        }
        catch(IOException e){
            System.err.println("Errore nella lettura della Teoria.");
            System.exit(1);
        }
        //String prologInputString = TextBox.replace('(', '[').replace(')', ']');
        try {
            Term expression = Term.parse(TextBox);
            // costruisce la struttura Prolog a partire dalla stringa
            Term query = // QUERY: evalExpr(espressione, Result)
                new Struct("intExpr", expression, new Var("Result"));
            // costruisce "a mano" la struttura Prolog per la query

            SolveInfo info = engine.solve(query); // ATTIVA IL MOTORE
            // l'oggetto info contiene le informazioni sulla soluzione

            if (info.isSuccess()) {
                Term resultTerm = info.getTerm("Result");
                String temp=resultTerm.toString();
                String input=temp.replace("'", "");
                System.out.println(input);
                //passo il risultato di prolog al parser
                String output=ModificaInInfissa(input);
                Risultato=TextBox + " = " + output;

            } else {
                Risultato = "err";
            }
            //System.exit(0);
            // fa chiudere i thread delle finestre di dialogo
        }
        catch (InvalidTermException e) {
                System.err.println("L'espressione non è valida in Prolog.");
                System.exit(1);
        }
        /*catch (InvalidVarNameException e) {
                System.err.println("Il nome della variabile non è valido.");
                System.exit(1);
        }*/
        catch (UnknownVarException e) { // NUOVA tuProlog 1.3
                System.err.println("Il nome della variabile è sconosciuto.");
                System.exit(1);
        }
        catch (NoSolutionException e) {
                System.err.println("Errore, non dovrei essere qui).");
                System.exit(1);
        }
        return Risultato;
    }
    public String ModificaInInfissa(String input){
        String output="";
        java.io.StringReader sr = new java.io.StringReader(input);
        java.io.Reader r = new java.io.BufferedReader(sr);
        Infissa parser= new Infissa(r);
        try{
            output=parser.S();
            System.out.println("output:"+output);
            System.out.println("OK");
        }
        catch (Exception e){
            System.out.println("eccezione");
        }catch (Error e){
            System.out.println("errore");
        }
        return output;
    }
}
